<?php

/**
 * 开放平台管理类接口控制器
 * Class OpenPlatAction
 * @author lilei<LL_strive@163.com> 2017-04-13
 */
class OpenPlatAction extends Action {

    /**
     * 根据查询条件模糊查询出所有接入平台信息
     *
     * @param null   $name      按name筛选
     * @param null   $isExport  是不是导出操作
     * @param string $order     排序字段
     * @param string $orderBy   排序规则
     * @param int    $start     起始偏移量
     * @param int    $limit     查询数量
     */
    public function getPlatList($name = null, $isExport = null, $order = 'id', $orderBy = 'asc', $start = 0, $limit = 25)
    {
        /** 1. 判断用户身份信息 */
        $retVal = Session::init();
        if (!$retVal) {
            Output::instance()->resultCode(code_access_denied);
            return;
        }
        $customerId = Session::$user["customerId"];
        Session::switchCustomer(0);

        /** 2. 创建数据模型 */
        $OpenplatModel = M('module_openplat');
        $MivendorModel = M('mivendor');
        $CustomerModel = M('customer_user');

        /** 3. 组织查询条件 */
        // 3.1 开放平台查询条件
        $openplatWhere['deleted'] = array('eq', 0);
        $openplatWhere['cid']     = array('eq', $customerId);
        $name ? $openplatWhere['name'] = array('like', "%{$name}%") : '';

        // 3.2 供应链查询条件
        $mivendorWhere['deleted'] = array('eq', 0);
        $mivendorWhere['cId']     = array('eq', $customerId);

        /** 4. 查询开放平台表获得开放平台信息 */
        // 4.1 查询开放平台信息
        $result_openplat = $OpenplatModel
            ->where($openplatWhere)
            ->order("$order $orderBy")
            ->limit("$start, $limit")
            ->field("id, appid, appsecret, token, name, vids, channelIds, interfaceUrl")
            ->select();

        // 4.2 遍历开放平台, 组合开放平台对应的供应链, 渠道信息
        for ($i = 0; $i < count($result_openplat); $i++) {
            // 一个开放平台对应的供应链
            $mivendorWhere['id']      = array('in', json_decode($result_openplat[$i]['vids']));
            $mivendorWhere['cId']     = array('eq', $customerId);
            $result_mivendor = $MivendorModel
                ->where($mivendorWhere)
                ->field("name")
                ->select();

            // 组织供应链名称
            $vnames = '';
            for ($j = 0; $j < count($result_mivendor); $j++) {
                if ($j != 0) {
                    $vnames.= ', ';
                }
                $vnames .= $result_mivendor[$j]['name'];
            }
            $result_openplat[$i]['vnames'] = $vnames;


            // 4.3.2 整理渠道数据
            $CustomerWhere['id'] = array('in', json_decode($result_openplat[$i]['channelIds']));
            $result_channel = $CustomerModel
                ->where($CustomerWhere)
                ->field('fullName')
                ->select();

            // 组织渠道名称
            $channelNames = '';
            for ($j = 0; $j < count($result_channel); $j++) {
                if ($j != 0) {
                    $channelNames.= ', ';
                }
                $channelNames .= $result_channel[$j]['fullName'];
            }
            $result_openplat[$i]['channelNames'] = $channelNames;
        }


        /** 5. 判断查询结果并返回 */
        if (!$isExport) {
            Output::instance()->objArray($result_openplat);
        } elseif ($isExport == 1) {
            $data[0] = array(
                'temp'      => "",
                'name'      => '平台名称',
                'appid'     => '平台Appid',
                'appsecret' => '平台Appsecret',
                'token'     => '平台Token',
                'vnames'    => '供应链',
                'channelNames' => '渠道',
                'interfaceUrl' => '接口地址'
            );
            foreach ($result_openplat as $k1 => $v1) {
                $data[$k1+1]['temp']      = '';
                $data[$k1+1]['name']      = $v1['name'];
                $data[$k1+1]['appid']     = $v1['appid'];
                $data[$k1+1]['appsecret'] = $v1['appsecret'];
                $data[$k1+1]['token']     = $v1['token'];
                $data[$k1+1]['vnames']    = $v1['vnames'];
                $data[$k1+1]['channelNames']    = $v1['channelNames'];
                $data[$k1+1]['interfaceUrl']    = $v1['interfaceUrl'];
            }
            Output::instance()->objArrayExcel('接入平台信息'.date("Y-m-d H:i:s"), '', $data);
        }
    }

    /**
     * 增加接入平台信息
     *
     * @param $name         平台名称
     * @param $appid        密友圈生成或菠萝派appid
     * @param $appsecret    密友圈生成或菠萝派appsecret
     * @param $token        唯一token
     * @param $vids         供应链
     * @param $interfaceUrl 接口url
     */
    public function addPlat($name, $appid, $appsecret, $token, $vids, $channelIds, $interfaceUrl)
    {
        /** 1. 判断用户身份信息 */
        $retVal = Session::init();
        if (!$retVal) {
            Output::instance()->resultCode(code_access_denied);
            return;
        }
        $customerId = Session::$user["customerId"];
        Session::switchCustomer(0);

        /** 2. 创建开发平台表数据模型 */
        $OpenplatModel = M('module_openplat');

        // 判断该用户是否已存在
        $result = $this->isExistToken($token);
        if ($result) {
            Output::instance()->resultCode(1, 'Token已存在');
            return;
        }

        /** 3. 组织增加的仓库数据 */
        $dataOpenplat = [
            'cid'           => $customerId,
            'name'          => $name,
            'appid'         => $appid,
            'appsecret'     => $appsecret,
            'token'         => $token,
            'vids'          => $vids,
            'channelIds'     => $channelIds,
            'interfaceUrl'  => $interfaceUrl,
            'createTime'    => date("Y-m-d H:i:s"),
            'updateTime'    => date("Y-m-d H:i:s"),
            'deleted'       => 0
        ];

        /** 4. 执行sql增加操作 */
        $resultOpenplatId = $OpenplatModel->add($dataOpenplat);

        /** 5. 返回结果*/
        if (!$resultOpenplatId) {
            Output::instance()->resultCode(code_sql_error);
            return;
        }
        Output::instance()->resultCode();
    }

    /**
     * 根据平台id查询某个指定平台的信息
     *
     * @param $id   指定平台的id
     * @return      返回该平台信息对象
     */
    public function getPlatById($id)
    {
        /** 1. 判断用户身份信息 */
        $retVal = Session::init();
        if (!$retVal) {
            Output::instance()->resultCode(code_access_denied);
            return;
        }
        $customerId = Session::$user["customerId"];
        Session::switchCustomer(0);

        /** 2. 创建数据模型 */
        $OpenplatModel = M('module_openplat');

        /** 3. 组织查询条件 */
        $openplatWhere['id']  = array('eq', $id);
        $openplatWhere['cId'] = array('eq', $customerId);

        /** 4. 查询平台表获得该平台信息 */
        $openplat = $OpenplatModel
            ->where($openplatWhere)
            ->field("id, appid, appsecret, token, name, vids, channelIds, interfaceUrl")
            ->find();

        /** 5. 判断查询结果并返回 */
        if ($openplat) {
            $openplat['vids'] = json_encode($openplat['vids']);
            $openplat['channelIds'] = json_encode($openplat['channelIds']);
            Output::instance()->object($openplat);
        } else {
            Output::instance()->resultCode(code_sql_error);
        }
    }

    /**
     * 增加接入平台信息
     *
     * @param $id           被修改的平台的id值
     * @param $name         平台名称
     * @param $appid        密友圈生成或菠萝派appid
     * @param $appsecret    密友圈生成或菠萝派appsecret
     * @param $token        唯一token
     * @param $vids         供应链
     * @param $interfaceUrl 接口url
     */
    public function updatePlat($id, $name, $appid, $appsecret, $token, $vids, $channelIds, $interfaceUrl)
    {
        /** 1. 判断用户身份信息 */
        $retVal = Session::init();
        if (!$retVal) {
            Output::instance()->resultCode(code_access_denied);
            return;
        }
        $customerId = Session::$user["customerId"];
        Session::switchCustomer(0);

        /** 2. 创建平台表数据模型 */
        $OpenplatModel = M('module_openplat');

        // 判断该用户是否已存在
        $result = $this->isExistToken($token, $id);
        if ($result) {
            Output::instance()->resultCode(1, 'Token已存在');
            return;
        }

        /** 3. 组织查询条件与更新数据 */
        $whereOpenplat['id']  = array('eq', $id);
        $whereOpenplat['cid'] = array('eq', $customerId);
        $dataOpenplat = [
            'cid'           => $customerId,
            'name'          => $name,
            'appid'         => $appid,
            'appsecret'     => $appsecret,
            'token'         => $token,
            'vids'          => $vids,
            'channelIds'     => $channelIds,
            'interfaceUrl'  => $interfaceUrl,
            'updateTime'    => date("Y-m-d H:i:s"),
        ];

        /** 4. 执行更新操作 */
        $result = $OpenplatModel->where($whereOpenplat)->save($dataOpenplat);

        /** 5. 返回更新结果*/
        if (!$result) {
            Output::instance()->resultCode(code_sql_error);
            return;
        }
        Output::instance()->resultCode();
    }

    /**
     * 软删除指定平台
     *
     * @param $id           需要删除的平台id
     * @return bool|void    删除操作结果
     */
    public function deletePlat($id)
    {
        /** 1. 判断用户身份信息 */
        $retVal = Session::init();
        if (!$retVal) {
            Output::instance()->resultCode(code_access_denied);
            return;
        }
        $customerId = Session::$user["customerId"];
        Session::switchCustomer(0);

        /** 2. 创建数据模型 */
        $OpenplatModel = M('module_openplat');

        /** 3. 组织删除条件和删除数据 */
        $whereOpenplat['id']  = array('eq', $id);
        $whereOpenplat['cid'] = array('eq', $customerId);
        $dataOpenplat = [
            'deleted'    => 1,
            'updateTime' => date("Y-m-d H:i:s"),
        ];

        /** 4. 执行删除操作*/
        $result = $OpenplatModel->where($whereOpenplat)->save($dataOpenplat);

        /** 5. 返回删除结果 */
        if (!$result) {
            Output::instance()->resultCode(code_sql_error);
            return;
        }
        Output::instance()->resultCode();
    }

    /**
     * 获得供应信息
     *
     * @return 供应链二位数组,供应id&name
     */
    public function getVendorList()
    {
        /** 1. 判断用户身份信息 */
        $retVal = Session::init();
        if (!$retVal) {
            Output::instance()->resultCode(code_access_denied);
            return;
        }
        $customerId = Session::$user["customerId"];
        Session::switchCustomer(0);

        /** 2. 创建供应链表数据模型 */
        $MivendorModel = M('mivendor');

        /** 3. 组织查询条件 */
        $mivendorWhere['deleted'] = array('eq', 0);
        $mivendorWhere['cId']     = array('eq', $customerId);
        // TODO: 这块还应该有一个筛选该用户下的供应链, 过滤不属于他的

        /** 4. 查询供应链表获得供应链信息 */
        $result = $MivendorModel
            ->where($mivendorWhere)
            ->field("id as vid, name as vname")
            ->select();

        /** 5. 判断查询结果并返回 */
        if ($result) {
            Output::instance()->objArray($result);
        } else {
            Output::instance()->resultCode(code_success);
        }
    }

    /**
     * 根据Token名判断Token是否已存在
     *
     * @param $token        添加的Token值
     * @param $id           如果是修改的话,携带该token来判断修改时去掉此条,否则修改报错
     * @return true | false true表示存在
     */
    protected function isExistToken($token, $id = null)
    {
        Session::switchCustomer(0);
        $OpenplatModel = M('module_openplat');

        $where['token']   = array('eq', $token);
        $where['deleted'] = array('eq', 0);
        if ($id) {
            $where['id'] = array('neq', $id);
        }

        $result = $OpenplatModel->where($where)->select();

        if (count($result) > 0) {
            return true;
        }
        return false;
    }
}